package com.bestcem.xm.qdes.handler.export.type;

import com.alibaba.fastjson.JSONObject;
import com.bestcem.xm.qdes.handler.export.BaseTypeHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;

@Slf4j
@Component
public class SingleHandler implements BaseTypeHandler {

    @Override
    public List<Object> getItems(JSONObject questionDict, JSONObject qgidDict, List<JSONObject> relatedRefs) {
        return getItems4Single(questionDict, qgidDict, relatedRefs);
        /**
         * 处理单选题
         *     :param questionDict:
         *     :param related_refs:
         *         关联结构: [{
         *                 "sourceGid": 65,
         *                 "targetGid": 83,
         *                 "type": "O",
         *                 "mode": "unselect"
         *             }, {
         *                 "sourceGid": 71,
         *                 "targetGid": 83,
         *                 "type": "O",
         *                 "mode": "select"
         *             }
         *         ]
         */
        //List<Object> items = new ArrayList<>();
        //String qgid = questionDict.getString("gid");
        //String qcid = questionDict.getString("cid");
        //String qtitle = questionDict.getString("title");
        //String qtype = questionDict.getString("qtype");
        //String customQtype = questionDict.getString("custom_qtype");
        //
        //int dispSelect = (int) questionDict.getOrDefault("dispSelect", 0);  // dispSelect:0 选项设置; 1 代码设置
        //boolean codeSelect = (boolean) questionDict.getOrDefault("codeSelect", true); // true: 显示代码/false: 抹灰代码
        //int jumpSelect = (int) questionDict.getOrDefault("jumpSelect", 0);  // jumpSelect:0 选项设置; 1 代码设
        //String dispCode = (String) questionDict.getOrDefault("disp_code", "");  // 显示代码
        //String jumpCode = (String) questionDict.getOrDefault("jump_code", "");  // 跳转代码
        //String autoCode = (String) questionDict.getOrDefault("auto_code", "");  // 自动勾选代码
        //
        //boolean voteSetting = (Boolean) questionDict.getOrDefault("vote_setting", false);  // 答题后展示投票结果: true/false
        //String answerStyle = (String) questionDict.getOrDefault("answerStyle", "custom");  // 下拉单选题: select
        //boolean required = (Boolean) questionDict.getOrDefault("required", false);  // 必答
        //String typeStr = QuestionTypeEnum.valueOf("QUESTION_TYPE_" + qtype.toUpperCase()).getDesc();
        //
        //if ("image_select".equals(customQtype)) {
        //    return items;
        //}
        //if (StringUtils.isNotEmpty(customQtype)) {
        //    try {
        //        QuestionCustomTypeEnum customQtypeDesc = QuestionCustomTypeEnum.valueOf("QUESTION_CUSTOM_TYPE_" + customQtype.toUpperCase());
        //        if (customQtypeDesc != null && StringUtils.isNotEmpty(customQtypeDesc.getDesc())) {
        //            typeStr = customQtypeDesc.getDesc();
        //        }
        //    } catch (IllegalArgumentException exp) {
        //        log.error("No found QuestionCustomTypeEnum");
        //    }
        //}
        //
        //List<String> item0 = new ArrayList<>();
        //item0.add(qcid + "[" + typeStr + "]");
        //item0.add(qtitle);
        //
        //List<String> qAttr = new ArrayList<>();
        //qAttr.add(required ? "必答" : "非必答");
        //if (voteSetting && ("single".equals(customQtype) || "image_select".equals(customQtype))) {
        //    qAttr.add("投票统计");
        //}
        //if ("select".equals(answerStyle)) {
        //    qAttr.add("下拉单选");
        //}
        //
        //if (dispSelect == 1 && codeSelect) {
        //    qAttr.add("显示代码");
        //} else if (dispSelect == 1 && !codeSelect) {
        //    qAttr.add("抹灰代码");
        //} else {
        //    qAttr.add("");
        //}
        //// 题目属性
        //List<String> allAttr = new ArrayList<>();
        //qAttr.forEach(at -> {
        //    allAttr.add("[" + at + "]");
        //});
        //item0.add(String.join("", allAttr));
        //// 显示代码，跳转代码，自动勾选代码
        //item0.add(dispSelect == 1 ? dispCode : "");
        //item0.add(jumpSelect == 1 ? jumpCode : "");
        //item0.add(autoCode);
        //items.add(item0);
        //
        //// 处理选项
        //String optionsRandom = questionDict.getString("options_random"); // 选项顺序: True, "sort", "reverse"
        //String optionAlign = questionDict.getString("align"); // 选项排列: "horizontal",  "vertical"
        //String columnValue = questionDict.getString("column_value"); // 横排 每行列数
        //
        //JSONArray optionItems = Optional.ofNullable(questionDict.getJSONArray("items")).orElse(new JSONArray());
        //if (!optionItems.isEmpty() || CollectionUtils.isNotEmpty(relatedRefs)) {
        //    List<String> optionCommAttr = new ArrayList<>();  // 选项属性
        //    optionCommAttr.add("顺序#" + ("True".equals(optionsRandom) ? "随机" : ("sort".equals(optionsRandom) ? "循环"
        //            : ("reverse".equals(optionsRandom) ? "倒序" : "默认"))));
        //    optionCommAttr.add("排列#" + ("横排#每行" + ("horizontal".equals(optionAlign)
        //            ? (StringUtils.isNotEmpty(columnValue) ? columnValue : "竖排") : "竖排")) + "列");
        //
        //    // 处理选项关联
        //    if (CollectionUtils.isNotEmpty(relatedRefs)) {
        //        List<String> relatedTmps = new ArrayList<>();
        //        for (JSONObject related : relatedRefs) {
        //            String sourceGid = related.getString("sourceGid");
        //            String mode = related.getString("mode");
        //            JSONObject question = qgidDict.getJSONObject(sourceGid);
        //
        //            List<String> tmps = new ArrayList<>();
        //            tmps.add("关联");
        //            tmps.add(question.getString("cid"));
        //            tmps.add("unselect".equals(mode) ? "未选中项" : "选中项");
        //            relatedTmps.add(String.join("#", tmps));
        //        }
        //        optionCommAttr.addAll(relatedTmps);
        //    }
        //    List<String> tmpList = new ArrayList<>();
        //    tmpList.add("选项");
        //    tmpList.add("");
        //    List<String> comAttr = new ArrayList<>();
        //    optionCommAttr.forEach(at -> {
        //        comAttr.add("[" + at + "]");
        //    });
        //    tmpList.add(String.join("", comAttr));
        //    items.add(tmpList);
        //    String aa = "";
        //
        //    for (Object oneItem : optionItems) {
        //        JSONObject optionDict = (JSONObject) oneItem;
        //        List<String> optionAttr = new ArrayList<>();
        //        boolean isOpen = (Boolean) optionDict.getOrDefault("is_open", false);
        //
        //        String dispCode1 = (String) optionDict.getOrDefault("disp_code", "");  // 显示代码
        //        String plasterCode1 = (String) optionDict.getOrDefault("plaster_code", "");  // 抹灰代码
        //        autoCode = (String) optionDict.getOrDefault("auto_code", "");  // 自动勾选代码
        //        boolean forbidRelated = (Boolean) optionDict.getOrDefault("forbidRelated", false); // 禁止选项关联
        //        boolean exclusive = (Boolean) optionDict.getOrDefault("exclusive", false); // 选项排他
        //        boolean fixed = (Boolean) optionDict.getOrDefault("fixed", false); // 选项固定
        //
        //        if (forbidRelated) {
        //            optionAttr.add("禁止选项关联");
        //        }
        //        if (exclusive) {
        //            optionAttr.add("选项排他");
        //        }
        //        if (fixed) {
        //            optionAttr.add("固定");
        //        }
        //        if (isOpen) {
        //            JSONObject openAttrs = (JSONObject) optionDict.getOrDefault("open_attrs", new JSONObject());
        //            List<String> optionOpenAttrs = optionOpenParse(openAttrs);
        //            optionAttr.add(String.join("#", optionOpenAttrs));
        //        }
        //
        //        List<String> opAttr = new ArrayList<>();
        //        optionAttr.forEach(at -> {
        //            opAttr.add("[" + at + "]");
        //        });
        //        String optionAttrstr = String.join("", opAttr);
        //
        //        List<String> tList = new ArrayList<>();
        //        tList.add(optionDict.getString("oid"));
        //        tList.add(optionDict.getString("title"));
        //        tList.add(optionAttrstr);
        //        if (dispSelect == 1 && codeSelect) {
        //            tList.add(dispCode1);
        //        } else if (dispSelect == 1 && !codeSelect) {
        //            tList.add(plasterCode1);
        //        } else {
        //            tList.add("");
        //        }
        //        tList.add("");
        //        tList.add(autoCode);
        //        items.add(tList);
        //    }
        //}
        //
        //// 处理选项分组
        //boolean optionsGroupEffect = (Boolean) questionDict.getOrDefault("optionsGroupEffect", false); // 是否启用 选项分组
        //boolean showOptionsGroupTitle = (Boolean) questionDict.getOrDefault("showOptionsGroupTitle", false); // 选项分组：显示组名
        //JSONArray optionGroupList = (JSONArray) questionDict.getOrDefault("option_group_list", new JSONArray()); // 选项分组列表
        //String optionsGroupRandom = questionDict.getString("options_group_random"); // 选项组间顺序：默认，随机，循环，倒序
        //String groupAlign = questionDict.getString("group_align"); // 选项分组排列：横、竖
        //String groupColumnValue = questionDict.getString("group_column_value"); // 分组横排：每行列数
        //
        //if (optionsGroupEffect) {
        //    List<String> optionGroupAttrs = new ArrayList<>();
        //
        //    optionGroupAttrs.add("顺序#" + ("True".equals(optionsGroupRandom) ? "随机" : ("sort".equals(optionsGroupRandom) ? "循环"
        //            : ("reverse".equals(optionsGroupRandom) ? "倒序" : "默认"))));
        //    optionGroupAttrs.add("排列#" + ("横排#每行" + ("horizontal".equals(groupAlign)
        //            ? (StringUtils.isNotEmpty(groupColumnValue) ? groupColumnValue : "竖排") : "竖排")) + "列");
        //    optionGroupAttrs.add(showOptionsGroupTitle ? "显示组名" : "不显示组名");
        //
        //    // 选项分组标识行
        //    List<String> tList = new ArrayList<>();
        //    tList.add("选项分组");
        //    tList.add("");
        //    List<String> gAttr = new ArrayList<>();
        //    optionGroupAttrs.forEach(at -> {
        //        gAttr.add("[" + at + "]");
        //    });
        //    tList.add(String.join("", gAttr));
        //    items.add(tList);
        //
        //    for (Object optionG : optionGroupList) {
        //        JSONObject optionGroup = (JSONObject) optionG;
        //        String optionGroupTitle = optionGroup.getString("title");
        //        boolean optionGroupFixed = optionGroup.getBoolean("fixed");
        //        JSONArray optionGroupItems = (JSONArray) optionGroup.getOrDefault("items", new JSONArray());
        //        String optionGroupDispCode = (String) optionGroup.getOrDefault("disp_code", "");
        //        List<String> ogQcids = new ArrayList<>();
        //        optionGroupItems.forEach(omp -> {
        //            JSONObject otmp = (JSONObject) omp;
        //            ogQcids.add(otmp.getString("oid"));
        //        });
        //
        //        List<String> tmList = new ArrayList<>();
        //        tmList.add(optionGroupTitle);
        //        tmList.add(String.join(",", ogQcids));
        //        tmList.add(optionGroupFixed ? "[固定]" : "");
        //        tmList.add(dispSelect == 1 ? optionGroupDispCode : "");
        //        items.add(tmList);
        //    }
        //}
        //
        //// 选项绑定
        //if ("True".equals(optionsRandom)) {
        //    boolean optionsBindEffect = questionDict.getBoolean("optionsBindEffect");  // 是否启用 选项绑定 选项顺序：随机
        //    List<JSONObject> optionBindList = questionDict.getObject("option_bind_list", List.class);  // 选项绑定列表
        //    if (optionsBindEffect && CollectionUtils.isNotEmpty(optionBindList)) {
        //        items.add(Arrays.asList("选项绑定", "", "", "", "", ""));  // 选项绑定 标识行
        //        for (JSONObject optionBind : optionBindList) {
        //            String title1 = optionBind.getString("title");
        //            JSONArray items1 = (JSONArray) optionBind.getOrDefault("items", new JSONArray());
        //            List<String> ogQcids = new ArrayList<>();
        //            items1.forEach(otmp -> {
        //                ogQcids.add(((JSONObject) otmp).getString("oid"));
        //            });
        //            items.add(Arrays.asList(title1, String.join(",", ogQcids), "", "", "", ""));
        //        }
        //    }
        //}
        //return items;
    }

    @Override
    public String getType() {
        return "single";
    }
}
